Next.js ์ฆ๋ถ ์ ์ ์ฌ์์ฑ(ISR)์ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ฑ๋ฅ ์ ํ ์์ด ์ค์๊ฐ ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ๋ง์กฑ์ํค๋ ๋์ ์ ์ ์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ์ธ์.
Next.js ์ฆ๋ถ ์ ์ ์ฌ์์ฑ: ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ๋์ ์ ์ ์ฌ์ดํธ
๋์์์ด ๋ฐ์ ํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์, ๋ฒ๊ฐ์ฒ๋ผ ๋น ๋ฅธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ฉด์ ์ฝํ ์ธ ๋ฅผ ์ ์ ํ๊ณ ๋์ ์ผ๋ก ์ ์งํ๋ ๊ฒ์ ๊ฐ์ฅ ์ค์ํ ๊ณผ์ ์ ๋๋ค. ์ ํต์ ์ธ ์ ์ ์ฌ์ดํธ ์์ฑ(SSG)์ ๋๋ผ์ด ์ฑ๋ฅ์ ์ ๊ณตํ์ง๋ง, ์์ฃผ ์ ๋ฐ์ดํธ๋๋ ์ฝํ ์ธ ๋ฅผ ์์ฉํ๊ธฐ์๋ ์ด๋ ค์์ด ๋ฐ๋ฆ ๋๋ค. ๋ฐ๋๋ก, ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR)์ ๋์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ์ง์ฐ ์๊ฐ์ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ ๋์ ์ธ React ํ๋ ์์ํฌ์ธ Next.js๋ ํ์ ์ ์ธ ๊ธฐ๋ฅ์ธ ์ฆ๋ถ ์ ์ ์ฌ์์ฑ(Incremental Static Regeneration, ISR)์ผ๋ก ์ด ๊ฐ๊ทน์ ์ฐ์ํ๊ฒ ๋ฉ์๋๋ค. ์ด ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ์ ํตํด ๊ฐ๋ฐ์๋ ๋์ ์ผ๋ก ๋๊ปด์ง๋ ์ ์ ์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ์ฌ, ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋ ๊ฐ์ง ์ฅ์ ์ ๋ชจ๋ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋์ ์ ์ ์ฌ์ดํธ์ ํ์์ฑ ์ดํดํ๊ธฐ
์์ญ ๋ ๋์ ์น์ฌ์ดํธ๋ ์์ํ๊ฒ ์ ์ ์ธ ๊ฒ๊ณผ ์์ํ๊ฒ ๋์ ์ธ ๊ฒ ์ฌ์ด์ ์คํํธ๋ผ์์ ์ด์๋์ด ์์ต๋๋ค. ์ ์ ์ฌ์ดํธ ์์ฑ(SSG)์ ๋น๋ ์์ ์ ๋ชจ๋ ํ์ด์ง๋ฅผ ๋ฏธ๋ฆฌ ๋ ๋๋งํ์ฌ ๋๋๋๋ก ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ๊ณผ ์ฐ์ํ SEO๋ฅผ ์ ๊ณตํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ด์ค ๊ธฐ์ฌ, ์ ์์๊ฑฐ๋ ์ํ ์ ๋ฐ์ดํธ ๋๋ ์์ ๋ฏธ๋์ด ํผ๋์ฒ๋ผ ์์ฃผ ๋ณ๊ฒฝ๋๋ ์ฝํ ์ธ ์ ๊ฒฝ์ฐ, SSG๋ ์ฝํ ์ธ ๊ฐ ์ ๋ฐ์ดํธ๋ ๋๋ง๋ค ์ ์ฒด ์ฌ์ดํธ๋ฅผ ๋ค์ ๋น๋ํ๊ณ ์ฌ๋ฐฐํฌํด์ผ ํ๋๋ฐ, ์ด๋ ์ข ์ข ๋น์ค์ฉ์ ์ด๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฝ๋๋ค. ์ด๋ฌํ ํ๊ณ๋ ์ค์๊ฐ ๋๋ ๊ฑฐ์ ์ค์๊ฐ์ ๊ฐ๊น์ด ์ฝํ ์ธ ์๊ตฌ ์ฌํญ์ด ์๋ ๋ง์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ SSG๊ฐ ๋ถ์ ํฉํ๊ฒ ๋ง๋ญ๋๋ค.
๋ฐ๋ฉด์ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR)์ ๊ฐ ์์ฒญ์ ๋ํด ์๋ฒ์์ ํ์ด์ง๋ฅผ ๋ ๋๋งํฉ๋๋ค. ์ด๋ ์ฝํ ์ธ ๊ฐ ํญ์ ์ต์ ์ํ์์ ๋ณด์ฅํ์ง๋ง, ์๋ฒ ๋ถํ๋ฅผ ์ ๋ฐํ๊ณ ์๋ฒ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋์ ์ด๊ธฐ ํ์ด์ง ๋ก๋ฉ์ด ๋๋ ค์ง ์ ์์ต๋๋ค. ๋ค์ํ ์ง๋ฆฌ์ ์์น์ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๊ฑธ์ณ ์๋ ์ ์ธ๊ณ ์ฌ์ฉ์์ ๊ฒฝ์ฐ, SSR์ ์ฑ๋ฅ ๊ฒฉ์ฐจ๋ฅผ ์ ํ์ํฌ ์ ์์ต๋๋ค.
๋ง์ ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด์์ ์ธ ์๋๋ฆฌ์ค๋ ์ ์ ํ์ผ์ ์ฑ๋ฅ ์ด์ ์ ํ์ฉํ๋ฉด์๋ ์ต์ ์ ๋ณด๋ฅผ ์ฆ์ ๋ฐ์ํ ์ ์๋ ์ฌ์ดํธ์ ๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ Next.js์ ์ฆ๋ถ ์ ์ ์ฌ์์ฑ์ด ๋น์ ๋ฐํฉ๋๋ค.
์ฆ๋ถ ์ ์ ์ฌ์์ฑ(ISR)์ด๋ ๋ฌด์์ธ๊ฐ?
์ฆ๋ถ ์ ์ ์ฌ์์ฑ(ISR)์ ์ฌ์ดํธ๊ฐ ๋น๋๋๊ณ ๋ฐฐํฌ๋ ํ์ ์ ์ ํ์ด์ง๋ฅผ ์ ๋ฐ์ดํธํ ์ ์๊ฒ ํด์ฃผ๋ Next.js์ ๊ธฐ๋ฅ์ ๋๋ค. ์ฝํ ์ธ ๋ณ๊ฒฝ์ ๋ฐ์ํ๊ธฐ ์ํด ์ ์ฒด ์ฌ๋น๋๊ฐ ํ์ํ ์ ํต์ ์ธ SSG์ ๋ฌ๋ฆฌ, ISR์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฐฉํดํ๊ฑฐ๋ ์ ์ฒด ์ฌ์ดํธ ์ฌ๋ฐฐํฌ ์์ด ๊ฐ๋ณ ํ์ด์ง๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ค์ ์์ฑํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ๊ฐ๋ ฅํ ์ฌ๊ฒ์ฆ(revalidation) ๋ฉ์ปค๋์ฆ์ ํตํด ๋ฌ์ฑ๋ฉ๋๋ค.
ISR๋ก ํ์ด์ง๊ฐ ์์ฑ๋๋ฉด Next.js๋ ์ ์ HTML ํ์ผ์ ์ ๊ณตํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ผ์ ๊ธฐ๊ฐ ํ์ ํด๋น ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด, Next.js๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์กฐ์ฉํ ํ์ด์ง๋ฅผ ๋ค์ ์์ฑํ ์ ์์ต๋๋ค. ์ฌ๊ฒ์ฆ ๊ธฐ๊ฐ ์ดํ์ ํ์ด์ง๋ฅผ ์์ฒญํ๋ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์๋ ์ด์ ์ ์บ์๋ ๋ฒ์ ์ ๋ฐ์ ์ ์์ง๋ง, ๊ทธ ์ดํ์ ์ฌ์ฉ์๋ค์ ์๋ก ์์ฑ๋ ์ต์ ๋ฒ์ ์ ๋ฐ๊ฒ ๋ฉ๋๋ค. ์ด ํ๋ก์ธ์ค๋ ์ ์ง์ ์ผ๋ก ์ฝํ ์ธ ๋ฅผ ์ ๋ฐ์ดํธํ๋ฉด์๋ ๋๋ถ๋ถ์ ์ฌ์ฉ์์๊ฒ ์ฌ์ดํธ ์ฑ๋ฅ์ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
ISR์ ์๋ ๋ฐฉ์: ์ฌ๊ฒ์ฆ ๋ฉ์ปค๋์ฆ
ISR์ ํต์ฌ์ ์ฌ๊ฒ์ฆ(revalidation) ๊ธฐ๋ฅ์ ์์ต๋๋ค. ISR๋ก ํ์ด์ง๋ฅผ ์ ์ํ ๋, revalidate
์๊ฐ(์ด ๋จ์)์ ์ง์ ํฉ๋๋ค. ์ด ์๊ฐ์ Next.js๊ฐ ํด๋น ํน์ ํ์ด์ง๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ผ๋ง๋ ์์ฃผ ๋ค์ ์์ฑํด์ผ ํ๋์ง๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
ํ๋ฆ์ ๋ถ์ํด ๋ณด๊ฒ ์ต๋๋ค:
- ๋น๋ ์์ : ์ผ๋ฐ์ ์ธ SSG์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋น๋ ์์ ํ์ด์ง๊ฐ ์ ์ ์ผ๋ก ์์ฑ๋ฉ๋๋ค.
- ์ฒซ ์์ฒญ: ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์์ฒญํฉ๋๋ค. Next.js๋ ์ ์ ์ผ๋ก ์์ฑ๋ HTML ํ์ผ์ ์ ๊ณตํฉ๋๋ค.
- ์บ์ ๋ง๋ฃ: ์ง์ ๋
revalidate
๊ธฐ๊ฐ์ด ์ง๋๋ฉด ํ์ด์ง์ ์บ์๋ ์ค๋๋(stale) ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. - ํ์ ์์ฒญ (Stale): ์บ์๊ฐ ๋ง๋ฃ๋ ํ ํ์ด์ง๋ฅผ ์์ฒญํ๋ ๋ค์ ์ฌ์ฉ์๋ *์ค๋๋์์ง๋ง* ์ฌ์ ํ ์บ์๋ ๋ฒ์ ์ ํ์ด์ง๋ฅผ ๋ฐ์ต๋๋ค. ์ด๋ ์ฑ๋ฅ์ ์ ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฌ๊ฒ์ฆ: ๋์์ Next.js๋ ํ์ด์ง์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฌ์์ฑ์ ํธ๋ฆฌ๊ฑฐํฉ๋๋ค. ์ด๋ ์ต์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ํ์ด์ง๋ฅผ ๋ค์ ๋ ๋๋งํ๋ ๊ณผ์ ์ ํฌํจํฉ๋๋ค.
- ์บ์ ์ ๋ฐ์ดํธ: ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฌ์์ฑ์ด ์๋ฃ๋๋ฉด ์๋กญ๊ณ ์ ๋ฐ์ดํธ๋ ๋ฒ์ ์ ํ์ด์ง๊ฐ ์บ์์์ ์ค๋๋ ๋ฒ์ ์ ๋์ฒดํฉ๋๋ค.
- ๋ค์ ์์ฒญ: ํ์ด์ง๋ฅผ ์์ฒญํ๋ ๋ค์ ์ฌ์ฉ์๋ ์๋ก ์์ฑ๋ ์ต์ ๋ฒ์ ์ ๋ฐ๊ฒ ๋ฉ๋๋ค.
์ด๋ฌํ ๋จ๊ณ์ ์ ๋ฐ์ดํธ ํ๋ก์ธ์ค๋ ์ฝํ ์ธ ๊ฐ ์๋ก ๊ณ ์ณ์ง๋ ๋์์๋ ์น์ฌ์ดํธ๊ฐ ๋์ ๊ฐ์ฉ์ฑ๊ณผ ์ฑ๋ฅ์ ์ ์งํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ฃผ์ ๊ฐ๋ :
revalidate
: ์ด๋ ISR์ ํ์ฑํํ๊ธฐ ์ํดgetStaticProps
์์ ์ฌ์ฉ๋๋ ์ฃผ์ ๋งค๊ฐ๋ณ์์ ๋๋ค. ์ด๋ฅผ ๋ํ๋ด๋ ์ซ์๋ฅผ ๊ฐ์ผ๋ก ๊ฐ์ง๋๋ค.- Stale-While-Revalidate: ์ด๊ฒ์ด ๊ธฐ๋ฐ์ด ๋๋ ์บ์ฑ ์ ๋ต์ ๋๋ค. ์ฌ์ฉ์๋ ์ ์ฝํ ์ธ ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์ฑ๋๋ ๋์ ์ฆ์ ์ค๋๋(์บ์๋) ์ฝํ ์ธ ๋ฅผ ๋ฐ์ต๋๋ค.
Next.js์์ ISR ๊ตฌํํ๊ธฐ
Next.js ์ ํ๋ฆฌ์ผ์ด์
์ ISR์ ๊ตฌํํ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก getStaticProps
ํจ์ ๋ด์์ ๊ตฌ์ฑํฉ๋๋ค.
์์: ์์ฃผ ์ ๋ฐ์ดํธ๋๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ
๊ฒ์๋ฌผ์ด ์ฌ์ํ ์์ ์ด๋ ์๋ก์ด ์ ๋ณด๋ก ์ ๋ฐ์ดํธ๋ ์ ์๋ ๋ธ๋ก๊ทธ๋ฅผ ์๊ฐํด ๋ณด์ธ์. ์ด๋ฌํ ์ ๋ฐ์ดํธ๊ฐ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ฆ๊ฐ์ ์ผ ํ์๋ ์์ง๋ง ๋น๊ต์ ๋น ๋ฅด๊ฒ ๋ฐ์๋๊ธฐ๋ฅผ ์ํฉ๋๋ค.
๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ํ์ด์ง์ ISR์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
// pages/posts/[slug].js
import { useRouter } from 'next/router'
export async function getStaticPaths() {
// Fetch all post slugs to pre-render them at build time
const posts = await fetch('https://your-api.com/posts').then(res => res.json());
const paths = posts.map((post) => ({
params: { slug: post.slug },
}));
return {
paths,
fallback: 'blocking', // or true, or false depending on your needs
};
}
export async function getStaticProps({ params }) {
// Fetch the specific post data for the current slug
const post = await fetch(`https://your-api.com/posts/${params.slug}`).then(res => res.json());
return {
props: {
post,
},
// Enable ISR: Revalidate this page every 60 seconds
revalidate: 60, // In seconds
};
}
function PostPage({ post }) {
const router = useRouter();
// If the page is not yet generated, this will be displayed
if (router.isFallback) {
return Loading...;
}
return (
{post.title}
{post.content}
{/* Other post details */}
);
}
export default PostPage;
์ด ์์ ์์๋:
getStaticPaths
๋ ๋น๋ ์์ ๊ฒฝ๋ก ์งํฉ(๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ์ฌ๋ฌ๊ทธ)์ ๋ฏธ๋ฆฌ ๋ ๋๋งํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.getStaticProps
๋ ํน์ ๊ฒ์๋ฌผ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์ค์ํ๊ฒ๋revalidate: 60
์์ฑ์ ์ค์ ํฉ๋๋ค. ์ด๋ Next.js์๊ฒ ์ด ํ์ด์ง๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋์์ 60์ด๋ง๋ค ๋ค์ ์์ฑํ๋๋ก ์ง์ํฉ๋๋ค.fallback: 'blocking'
์ ์ฌ์ฉ์๊ฐ ๋น๋ ์์ ๋ฏธ๋ฆฌ ๋ ๋๋ง๋์ง ์์ ๊ฒฝ๋ก๋ฅผ ์์ฒญํ ๊ฒฝ์ฐ, ์๋ฒ๊ฐ ํ์ด์ง๋ฅผ ์์ฑํ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ์ ๊ณตํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์ข ์ข ISR๊ณผ ํจ๊ป ์ฌ์ฉ๋ฉ๋๋ค.
ISR๊ณผ ํจ๊ป `fallback` ์ดํดํ๊ธฐ
getStaticPaths
์ fallback
์ต์
์ ISR์ ์ฌ์ฉํ ๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค:
fallback: false
:getStaticPaths
์์ ๋ฐํ๋์ง ์์ ๊ฒฝ๋ก๋ 404 ํ์ด์ง๋ฅผ ๋ฐํํฉ๋๋ค. ๋ชจ๋ ๋์ ๊ฒฝ๋ก๊ฐ ๋น๋ ์์ ์๋ ค์ง ์ฌ์ดํธ์ ์ ์ฉํฉ๋๋ค.fallback: true
:getStaticPaths
์์ ๋ฐํ๋์ง ์์ ๊ฒฝ๋ก๋ ๋จผ์ ํด๋ผ์ด์ธํธ ์ธก์์ ์์ฑ(๋ก๋ฉ ์ํ ํ์)์ ์๋ํฉ๋๋ค. ์์ฑ ํ ํ์ด์ง๋ ์บ์๋ฉ๋๋ค. ๋์ ๊ฒฝ๋ก๊ฐ ๋ง์ ๊ฒฝ์ฐ ์ฑ๋ฅ์ ์ข์ ์ ์์ต๋๋ค.fallback: 'blocking'
:getStaticPaths
์์ ๋ฐํ๋์ง ์์ ๊ฒฝ๋ก๋ ์ฒซ ์์ฒญ ์ ์๋ฒ ๋ ๋๋ง๋ฉ๋๋ค. ์ฆ, ์ฌ์ฉ์๋ ํ์ด์ง๊ฐ ์์ฑ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ดํ ์์ฒญ์ ์ฌ๊ฒ์ฆ๋ ๋๊น์ง ์บ์๋ ์ ์ ํ์ด์ง๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ฒซ ์์ฒญ ์ดํ์๋ ํญ์ ์ ์ ํ์ผ์ ์ ๊ณตํ์ฌ ์ฑ๋ฅ์ ์ ์งํ๋ฏ๋ก ISR์ ์ ํธ๋๋ ์ต์ ์ ๋๋ค.
ISR์ ๊ฒฝ์ฐ, ์๋ก์ด ๋์ ๊ฒฝ๋ก๊ฐ ํ์์ ๋ฐ๋ผ ์์ฑ๋๊ณ ISR์ ์ด์ ์ ๋๋ฆด ์ ์๋๋ก fallback: 'blocking'
๋๋ fallback: true
๊ฐ ์ผ๋ฐ์ ์ผ๋ก ๋ ์ ํฉํฉ๋๋ค.
๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํ ISR์ ์ด์
ISR์ ์ฅ์ ์ ํนํ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ํ ๋ ๋๋๋ฌ์ง๋๋ค:
1. ์ง์ญ ์ ๋ฐ์ ๊ฑธ์น ์ฑ๋ฅ ํฅ์
๋ฏธ๋ฆฌ ๋ ๋๋ง๋ ์ ์ ํ์ผ์ ์ ๊ณตํจ์ผ๋ก์จ ISR์ ์ฌ์ฉ์๊ฐ ์์น์ ๊ด๊ณ์์ด ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ์ ๊ฒฝํํ๋๋ก ๋ณด์ฅํฉ๋๋ค. stale-while-revalidate
์ ๋ต์ ์ฝํ
์ธ ์
๋ฐ์ดํธ ์ค์๋ ๋๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ ์ฌ์ ํ ์บ์๋ ๋น ๋ฅธ ๋ก๋ฉ ํ์ด์ง๋ฅผ ๋ฐ๊ฒ ๋์ด ๋คํธ์ํฌ ์ง์ฐ ๋ฐ ์๋ฒ ์ฒ๋ฆฌ ์๊ฐ์ ์ํฅ์ ์ต์ํํจ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ์ธํฐ๋ท ์ธํ๋ผ๊ฐ ๋ ๊ฒฌ๊ณ ํ ์ง์ญ์ ์ฌ์ฉ์ ์ฐธ์ฌ๋ฅผ ์ ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
2. SSR ์ค๋ฒํค๋ ์๋ ๊ฑฐ์ ์ค์๊ฐ ์ฝํ ์ธ
์์ฃผ ์ ๋ฐ์ดํธ๋์ด์ผ ํ์ง๋ง ์ ๋์ ์ธ ์ค์๊ฐ ์ ํ๋๊ฐ ํ์ํ์ง ์์ ์ฝํ ์ธ (์: ์ฃผ๊ฐ, ๋ด์ค ํผ๋, ์ ํ ์ฌ๊ณ )์ ๊ฒฝ์ฐ ISR์ ์๋ฒฝํ ํํ์ ์ ์ ๊ณตํฉ๋๋ค. ์งง์ ์ฌ๊ฒ์ฆ ๊ธฐ๊ฐ(์: 30-60์ด)์ ์ค์ ํ์ฌ ์ง์์ ์ธ SSR๊ณผ ๊ด๋ จ๋ ํ์ฅ์ฑ ๋ฐ ์ฑ๋ฅ ๋ฌธ์ ์์ด ๊ฑฐ์ ์ค์๊ฐ์ ๊ฐ๊น์ด ์ ๋ฐ์ดํธ๋ฅผ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
3. ์๋ฒ ๋ถํ ๋ฐ ๋น์ฉ ์ ๊ฐ
ํ์ด์ง๊ฐ ์ฃผ๋ก CDN(์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ) ๋๋ ์ ์ ํ์ผ ํธ์คํ ์์ ์ ๊ณต๋๋ฏ๋ก ์๋ณธ ์๋ฒ์ ๋ถํ๊ฐ ํฌ๊ฒ ์ค์ด๋ญ๋๋ค. ISR์ ์ฌ๊ฒ์ฆ ๊ธฐ๊ฐ ๋์์๋ง ์๋ฒ ์ธก ์ฌ์์ฑ์ ํธ๋ฆฌ๊ฑฐํ๋ฏ๋ก ํธ์คํ ๋น์ฉ์ ๋ฎ์ถ๊ณ ํ์ฅ์ฑ์ ํฅ์์ํต๋๋ค. ์ด๋ ๋ค์ํ ๊ธ๋ก๋ฒ ์์น์์ ๋์ ํธ๋ํฝ์ ๊ฒฝํํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋นํ ์ด์ ์ ๋๋ค.
4. ํฅ์๋ SEO ์์
๊ฒ์ ์์ง ํฌ๋กค๋ฌ๋ ๋น ๋ฅด๊ฒ ๋ก๋ฉ๋๋ ์น์ฌ์ดํธ๋ฅผ ์ ํธํฉ๋๋ค. ์ ์ ์์ฐ์ ๋น ๋ฅด๊ณ ํจ์จ์ ์ผ๋ก ์ ๊ณตํ๋ ISR์ ๋ฅ๋ ฅ์ SEO์ ๊ธ์ ์ ์ผ๋ก ๊ธฐ์ฌํฉ๋๋ค. ๋ํ, ์ฝํ ์ธ ๋ฅผ ์ ์ ํ๊ฒ ์ ์งํจ์ผ๋ก์จ ISR์ ๊ฒ์ ์์ง์ด ์ต์ ์ ๋ณด๋ฅผ ์ธ๋ฑ์ฑํ๋ ๋ฐ ๋์์ ์ฃผ์ด ์ ์ธ๊ณ ์ฌ์ฉ์์ ๋ํ ๊ฒ์ ๊ฐ๋ฅ์ฑ์ ํฅ์์ํต๋๋ค.
5. ๊ฐ์ํ๋ ์ฝํ ์ธ ๊ด๋ฆฌ
์ฝํ ์ธ ์ ์์์ ๊ด๋ฆฌ์๋ ์ ์ฒด ์ฌ์ดํธ ์ฌ๋น๋๋ฅผ ํธ๋ฆฌ๊ฑฐํ ํ์ ์์ด ์ฝํ ์ธ ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. CMS์์ ์ฝํ ์ธ ๊ฐ ์ ๋ฐ์ดํธ๋๊ณ ISR ํ๋ก์ธ์ค์ ์ํด ๊ฐ์ ธ์์ง๋ฉด, ๋ค์ ์ฌ๊ฒ์ฆ ์ฃผ๊ธฐ ํ์ ๋ณ๊ฒฝ ์ฌํญ์ด ์ฌ์ดํธ์ ๋ฐ์๋ฉ๋๋ค. ์ด๋ ์ฝํ ์ธ ๊ฒ์ ์ํฌํ๋ก์ฐ๋ฅผ ๊ฐ์ํํฉ๋๋ค.
ISR ์ฌ์ฉ ์๊ธฐ (๊ทธ๋ฆฌ๊ณ ์ฌ์ฉํ์ง ๋ง์์ผ ํ ์๊ธฐ)
ISR์ ๊ฐ๋ ฅํ ๋๊ตฌ์ด์ง๋ง, ๋ค๋ฅธ ๊ธฐ์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฌ๋ฐ๋ฅธ ๋งฅ๋ฝ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ต๋๋ค.
ISR์ ์ด์์ ์ธ ์ฌ์ฉ ์ฌ๋ก:
- ์ ์์๊ฑฐ๋ ์ํ ํ์ด์ง: ํ๋ฃจ ๋์ ๋ณ๊ฒฝ๋ ์ ์๋ ์ํ ์ ๋ณด, ๊ฐ๊ฒฉ ๋ฐ ์ฌ๊ณ ๋ฅผ ํ์ํฉ๋๋ค.
- ๋ด์ค ๋ฐ ๊ธฐ์ฌ ์น์ฌ์ดํธ: ์๋ณด๋ ์ฌ์ํ ํธ์ง์ผ๋ก ๊ธฐ์ฌ๋ฅผ ์ต์ ์ํ๋ก ์ ์งํฉ๋๋ค.
- ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ: ์ ์ฒด ์ฌ๋ฐฐํฌ ์์ด ์ฝํ ์ธ ์ ๋ฐ์ดํธ ๋ฐ ์์ ์ ํ์ฉํฉ๋๋ค.
- ์ด๋ฒคํธ ๋ชฉ๋ก: ์ด๋ฒคํธ ์ผ์ , ์ฅ์ ๋๋ ์ฐธ๊ฐ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
- ํ ํ์ด์ง ๋๋ ๋๋ ํ ๋ฆฌ: ์ต๊ทผ ์ธ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํฉ๋๋ค.
- ๋์๋ณด๋ ์์ ฏ: ๋ฐ๋ฆฌ์ด ๋จ์์ ์ ํ์ฑ์ด ํ์ํ์ง ์์ ์์ฃผ ์ ๋ฐ์ดํธ๋๋ ๋ฐ์ดํฐ๋ฅผ ํ์ํฉ๋๋ค.
- ๋ฌธ์ ์ฌ์ดํธ: ์๋ก์ด ๊ธฐ๋ฅ์ด๋ ์์ ์ฌํญ์ด ๋ฆด๋ฆฌ์ค๋ ๋ ๋ฌธ์๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
ISR์ด ์ต์ ์ ์ ํ์ด ์๋ ์ ์๋ ๊ฒฝ์ฐ:
- ๊ณ ๋๋ก ๊ฐ์ธํ๋ ์ฝํ ์ธ : ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์์ ์ ํ๋กํ์ด๋ ์ธ์ ์ ๊ธฐ๋ฐ์ผ๋ก ๊ณ ์ ํ ์ฝํ ์ธ ๋ฅผ ๋ณด๋ ๊ฒฝ์ฐ SSR ๋๋ ํด๋ผ์ด์ธํธ ์ธก ํ์นญ์ด ๋ ์ ํฉํ ์ ์์ต๋๋ค. ISR์ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ๋์ฒด๋ก ๋์ผํ์ง๋ง ์ฃผ๊ธฐ์ ์ธ ์ ๋ฐ์ดํธ๊ฐ ํ์ํ ์ฝํ ์ธ ์ ๊ฐ์ฅ ์ ํฉํฉ๋๋ค.
- ๋ฐ๋ฆฌ์ด ๋จ์์ ์ ๋ฐํ ๋ฐ์ดํฐ: ์ ๋์ ์ธ ์ค์๊ฐ ๋ฐ์ดํฐ๊ฐ ํ์ํ ์ ํ๋ฆฌ์ผ์ด์ (์: ์ค์๊ฐ ์ฃผ์ ์์ธ, ์ค์๊ฐ ์ ์ฐฐ ์์คํ )์ ๊ฒฝ์ฐ ISR์ ์ฌ๊ฒ์ฆ ๊ธฐ๊ฐ์ ์ฉ๋ฉํ ์ ์๋ ์ง์ฐ์ ์ ๋ฐํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ์๋ ์น์์ผ(WebSockets)์ด๋ ์๋ฒ-์ ์ก ์ด๋ฒคํธ(SSE)๊ฐ ๋ ์ ํฉํ ์ ์์ต๋๋ค.
- ์ ๋ ๋ณ๊ฒฝ๋์ง ์๋ ์ฝํ ์ธ : ์ฝํ ์ธ ๊ฐ ์ ์ ์ด๊ณ ๋น๋ ์๊ฐ ์ดํ ์ ๋ฐ์ดํธ๊ฐ ํ์ ์๋ ๊ฒฝ์ฐ, ์ ํต์ ์ธ SSG๊ฐ ์ถฉ๋ถํ๋ฉฐ ๋ ๊ฐ๋จํฉ๋๋ค.
๊ณ ๊ธ ISR ์ ๋ต ๋ฐ ๊ณ ๋ ค ์ฌํญ
ISR์ ๊ธฐ๋ณธ ๊ตฌํ์ ๊ฐ๋จํ์ง๋ง, ํนํ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ์ํด ์ฌ์ฉ์ ์ต์ ํํ๊ธฐ ์ํ ๊ณ ๊ธ ์ ๋ต๊ณผ ๊ณ ๋ ค ์ฌํญ์ด ์์ต๋๋ค.
1. ์บ์ ๋ฌดํจํ ์ ๋ต (์๊ฐ ๊ธฐ๋ฐ์ ๋์ด์)
์๊ฐ ๊ธฐ๋ฐ ์ฌ๊ฒ์ฆ์ด ๊ธฐ๋ณธ์ ์ด๊ณ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ด์ง๋ง, Next.js๋ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ์ฌ๊ฒ์ฆ์ ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์๋ง์(์: CMS ์นํ ์ด ์ ๋ฐ์ดํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ๋) ์ฝํ ์ธ ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์ถ์ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์๋ฒ๋ฆฌ์ค ํจ์๋ API ๋ผ์ฐํธ ๋ด์์ res.revalidate(path)
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ํ์ด์ง๋ฅผ ์๋์ผ๋ก ์ฌ๊ฒ์ฆํ ์ ์์ต๋๋ค.
// pages/api/revalidate.js
export default async function handler(req, res) {
// Check for a secret token to ensure only authorized requests can revalidate
if (req.query.secret !== process.env.REVALIDATE_SECRET) {
return res.status(401).json({ message: 'Invalid token' });
}
try {
// Revalidate the specific post page
await res.revalidate('/posts/my-updated-post');
return res.json({ revalidated: true });
} catch (err) {
// If there was an error, Next.js will continue to serve the stale page
return res.status(500).send('Error revalidating');
}
}
์ด API ๋ผ์ฐํธ๋ /posts/my-updated-post
์ ๊ด๋ จ๋ ์ฝํ
์ธ ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค CMS๋ ๋ค๋ฅธ ์๋น์ค์์ ํธ์ถํ ์ ์์ต๋๋ค.
2. ์ค์ ๋์ ๊ฒฝ๋ก์ `fallback`
์ฌ๋ฐ๋ฅธ fallback
์ต์
์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ๋น๋ ์์ ์ ๊ฒ์๋๋ ์์ธก ๊ฐ๋ฅํ ์์ ๊ฒ์๋ฌผ์ด ์๋ ๋ธ๋ก๊ทธ์ ๊ฒฝ์ฐ
fallback: false
๋ก ์ถฉ๋ถํ ์ ์์ง๋ง, ๊ทธ๋ฌ๋ฉด ๋ค์ ๋น๋๊น์ง ์ ๊ฒ์๋ฌผ์ ์ ๊ทผํ ์ ์์ต๋๋ค. - ๋ง์ ์ ๊ฒ์๋ฌผ์ด๋ ์ ํ์ด ์ ๊ธฐ์ ์ผ๋ก ์ถ๊ฐ๋ ๊ฒ์ผ๋ก ์์๋๋ ๊ฒฝ์ฐ, ISR๊ณผ ํจ๊ป
fallback: 'blocking'
์ด ์ผ๋ฐ์ ์ผ๋ก ์ ํธ๋ฉ๋๋ค. ์ด๋ ์ ํ์ด์ง๊ฐ ํ์์ ๋ฐ๋ผ ์์ฑ๋๊ณ , ์ฒซ ์์ฒญ ํ ์์ ํ ์ ์ ์ด ๋๋ฉฐ, ์ดํ ์ ๋ฐ์ดํธ์ ๋ํด ISR์ ์ด์ ์ ๋๋ฆฌ๋๋ก ๋ณด์ฅํฉ๋๋ค.
3. ์ ์ ํ ์ฌ๊ฒ์ฆ ์๊ฐ ์ ํํ๊ธฐ
revalidate
์๊ฐ์ ๊ท ํ์ ์ด๋ฃจ์ด์ผ ํฉ๋๋ค:
- ์งง์ ์๊ฐ (์: 10-60์ด): ์ค์๊ฐ ์ ์๋ ์ ํ ์ฌ๊ณ ์์ค๊ณผ ๊ฐ์ด ๋งค์ฐ ์์ฃผ ๋ณ๊ฒฝ๋๋ ์ฝํ ์ธ ์ ์ ํฉํฉ๋๋ค. ์ฆ๊ฐ๋ ์๋ฒ ๋ถํ ๋ฐ API ์์ฒญ ๋น์ฉ์ ์ ์ํด์ผ ํฉ๋๋ค.
- ๊ธด ์๊ฐ (์: 300-3600์ด ๋๋ 5-60๋ถ): ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ด๋ ๋ด์ค ๊ธฐ์ฌ์ ๊ฐ์ด ๋ ์์ฃผ ์ ๋ฐ์ดํธ๋๋ ์ฝํ ์ธ ์ ์ด์์ ์ ๋๋ค. ์ด๋ ์ ์ ์บ์ฑ์ ์ด์ ์ ๊ทน๋ํํฉ๋๋ค.
์ด ๊ฐ์ ์ค์ ํ ๋ ์ค๋๋ ์ฝํ ์ธ ์ ๋ํ ์ฌ์ฉ์์ ํ์ฉ ๋ฒ์์ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ๋น๋๋ฅผ ๊ณ ๋ คํ์ธ์.
4. ํค๋๋ฆฌ์ค CMS์ ํตํฉ
ISR์ Contentful, Strapi, Sanity ๋๋ WordPress(REST API ์ฌ์ฉ)์ ๊ฐ์ ํค๋๋ฆฌ์ค ์ฝํ ์ธ ๊ด๋ฆฌ ์์คํ (CMS)๊ณผ ๋งค์ฐ ์ ์๋ํฉ๋๋ค. ํค๋๋ฆฌ์ค CMS๋ ์ฝํ ์ธ ๊ฐ ๊ฒ์๋๊ฑฐ๋ ์ ๋ฐ์ดํธ๋ ๋ ์นํ ์ ํธ๋ฆฌ๊ฑฐํ ์ ์์ผ๋ฉฐ, ์ด๋ Next.js API ๋ผ์ฐํธ(์์์ ๋ณด์ฌ์ค ๋ฐ์ ๊ฐ์ด)๋ฅผ ํธ์ถํ์ฌ ์ํฅ์ ๋ฐ๋ ํ์ด์ง๋ฅผ ์ฌ๊ฒ์ฆํ ์ ์์ต๋๋ค. ์ด๋ ๋์ ์ ์ ์ฝํ ์ธ ๋ฅผ ์ํ ๊ฐ๋ ฅํ๊ณ ์๋ํ๋ ์ํฌํ๋ก์ฐ๋ฅผ ๋ง๋ญ๋๋ค.
5. CDN ์บ์ฑ ๋์
Next.js ISR์ CDN๊ณผ ํจ๊ป ์๋ํฉ๋๋ค. ํ์ด์ง๊ฐ ์์ฑ๋๋ฉด ์ผ๋ฐ์ ์ผ๋ก CDN์์ ์ ๊ณต๋ฉ๋๋ค. revalidate
์๊ฐ์ CDN์ ์ฃ์ง ์๋ฒ๊ฐ ์บ์๋ฅผ ์ค๋๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๋ ์์ ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. Vercel์ด๋ Netlify์ ๊ฐ์ ๊ด๋ฆฌํ ํ๋ซํผ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ด๋ฌํ ํตํฉ์ ์๋น ๋ถ๋ถ์ ์ํํ๊ฒ ์ฒ๋ฆฌํด ์ค๋๋ค. ์ฌ์ฉ์ ์ ์ CDN ์ค์ ์ ๊ฒฝ์ฐ, CDN์ด Next.js์ ์บ์ฑ ํค๋๋ฅผ ์กด์คํ๋๋ก ๊ตฌ์ฑ๋์๋์ง ํ์ธํ์ธ์.
๊ธ๋ก๋ฒ ์์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก
ISR์ด ๊ธ๋ก๋ฒ ๋งฅ๋ฝ์์ ์ด๋ป๊ฒ ์ ์ฉ๋ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- ๊ธ๋ก๋ฒ ๋ด์ค ์์ง๊ธฐ: ๋ค์ํ ๊ตญ์ ์์ค๋ก๋ถํฐ ๋ด์ค๋ฅผ ์์งํ๋ ์น์ฌ์ดํธ๋ฅผ ์์ํด ๋ณด์ธ์. ISR์ ํค๋๋ผ์ธ๊ณผ ๊ธฐ์ฌ ์์ฝ์ด ๋ช ๋ถ๋ง๋ค ์
๋ฐ์ดํธ๋๋๋ก ๋ณด์ฅํ์ฌ, ์๋ฒ์ ๊ณผ๋ถํ๋ฅผ ์ฃผ์ง ์์ผ๋ฉด์ ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ต์ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
revalidate
์๊ฐ์ 300์ด๋ก ์ค์ ๋ ์ ์์ต๋๋ค. - ๊ตญ์ ์ ์์๊ฑฐ๋ ํ๋ซํผ: ์ ์ธ๊ณ์ ์ผ๋ก ์ ํ์ ํ๋งคํ๋ ์จ๋ผ์ธ ์๋งค์
์ฒด๋ ์ ํ ํ์ด์ง์ ISR์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ํ์ ์ฌ๊ณ ์์ค์ด๋ ๊ฐ๊ฒฉ์ด ์
๋ฐ์ดํธ๋ ๋(์ง์ญ๋ณ ์ฌ๊ณ ๋ ํ์จ ๋ณ๋์ ์ํฅ์ ๋ฐ์ ์ ์์), ISR์ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ช ๋ถ ๋ด์ ์ฌ์ดํธ ์ ์ฒด์ ๋ฐ์๋๋๋ก ๋ณด์ฅํ ์ ์์ผ๋ฉฐ,
revalidate
์๊ฐ์ 60์ด๋ก ์ค์ ๋ ์ ์์ต๋๋ค. - ๋ค๊ตญ์ด ์ฝํ ์ธ ์ฌ์ดํธ: ์ฌ๋ฌ ์ธ์ด๋ก ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๋ ์ฌ์ดํธ์ ๊ฒฝ์ฐ, ๊ฐ ๋ฒ์ญ ๋ฒ์ ์ด ISR์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค. ํต์ฌ ์ฝํ ์ธ ๊ฐ ์ ๋ฐ์ดํธ๋๋ฉด ๋ชจ๋ ํ์งํ๋ ๋ฒ์ ์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฌ๊ฒ์ฆํ ์ ์์ต๋๋ค.
- ๊ธ๋ก๋ฒ ์ด๋ฒคํธ ํฐ์ผํ : ์ฃผ์ ๊ตญ์ ํ์ฌ์ ๊ฒฝ์ฐ, ์ข์ ๊ฐ์ฉ์ฑ์ด๋ ์ด๋ฒคํธ ์ผ์ ์ด ์์ฃผ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ISR์ ์ด๋ฌํ ํ์ด์ง๋ฅผ ์ต์ ์ํ๋ก ์ ์งํ์ฌ, ๋ค๋ฅธ ์๊ฐ๋์์ ํฐ์ผ์ ๊ตฌ๋งคํ๋ ์ฌ์ฉ์์๊ฒ ์ ์ ์ด๊ณ ๋น ๋ฅธ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ฃผ์ ๊ธ๋ก๋ฒ ๋ชจ๋ฒ ์ฌ๋ก:
- ์ฌ๊ฒ์ฆ ์ ์๊ฐ๋ ๊ณ ๋ ค:
revalidate
๋ ๊ณ ์ ๋ ๊ธฐ๊ฐ์ด์ง๋ง, ์ฃผ์ ์ฝํ ์ธ ์ ๋ฐ์ดํธ๊ฐ ๋ฐ์ํ๋ ์์ ์ ์ผ๋์ ๋์ธ์. ์ฌ๊ฒ์ฆ์ ์ต๊ณ ์ฝํ ์ธ ์ ๋ฐ์ดํธ ์๊ฐ๊ณผ ๋ง์ถ๋ ๊ฒ์ด ์ ์ตํ ์ ์์ต๋๋ค. - ๋ค์ํ ์ง์ญ์์ ์ฑ๋ฅ ํ ์คํธ: Google PageSpeed Insights๋ WebPageTest์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ์ง๋ฆฌ์ ์์น์์ ์ฌ์ดํธ์ ์ฑ๋ฅ์ ํ์ธํ์ธ์.
- API ์ฌ์ฉ๋ ๋ฐ ๋น์ฉ ๋ชจ๋ํฐ๋ง: ISR์ด ์ธ๋ถ API์ ์์กดํ๋ ๊ฒฝ์ฐ, ์ฌ์ฉ๋์ ๋ชจ๋ํฐ๋งํ๊ณ ์ฆ์ ์ฌ๊ฒ์ฆ์ผ๋ก ์ธํด ์๋ ์ ํ์ ์ด๊ณผํ๊ฑฐ๋ ์์์น ๋ชปํ ๋น์ฉ์ด ๋ฐ์ํ์ง ์๋๋ก ํ์ธ์.
- ๊ธ๋ก๋ฒ CDN ์ฌ์ฉ: ๊ด๋ฒ์ํ ๊ธ๋ก๋ฒ ๊ฑฐ์ ์ ๊ฐ์ง ์ฝํ ์ธ ์ ์ก ๋คํธ์ํฌ๋ฅผ ํ์ฉํ์ฌ ์ ์ ์์ฐ์ด ์ฌ์ฉ์์ ๊ฐ๊น์ด ์์น์์ ์ ๊ณต๋๋๋ก ํ์ธ์.
์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ์ด๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ
๊ฐ๋ ฅํ์ง๋ง, ISR์ ์ ์คํ๊ฒ ๊ตฌํํ์ง ์์ผ๋ฉด ์์์น ๋ชปํ ๋์์ ์ ๋ฐํ ์ ์์ต๋๋ค:
- ์ง๋์น๊ฒ ๊ณต๊ฒฉ์ ์ธ ์ฌ๊ฒ์ฆ:
revalidate
๋ฅผ ๋งค์ฐ ๋ฎ์ ๊ฐ(์: 1์ด)์ผ๋ก ์ค์ ํ๋ฉด ์ ์ ์์ฑ์ ์ด์ ์ ๋ฌดํจํํ๊ณ ๋ฐ์ดํฐ ์์ค์ ์๋ฒ์ ๊ณผ๋ํ ๋ถํ๋ฅผ ์ฃผ์ด, ์ ์ฌ์ ์ผ๋ก ์์ธก ๋ถ๊ฐ๋ฅํ ์ ๋ฌ ๋ฉ์ปค๋์ฆ์ ๊ฐ์ง SSR์ฒ๋ผ ๋์ํ๊ฒ ํ ์ ์์ต๋๋ค. - `fallback` ์ํ ๋ฌด์: ์๋ก์ด ๋์ ๊ฒฝ๋ก๊ฐ ์์ฑ๋ ๋ `router.isFallback` ์ํ๋ฅผ ์ ๋๋ก ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ด ๊นจ์ง ์ ์์ต๋๋ค.
- ์บ์ ๋ฌดํจํ ๋ก์ง ์ค๋ฅ: ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ์บ์ ๋ฌดํจํ ๋ก์ง์ ๊ฒฐํจ์ด ์์ผ๋ฉด ์ฝํ ์ธ ๊ฐ ์ค๋๋์ด ์ ๋ฐ์ดํธ๋์ง ์๊ฑฐ๋ ์๋ชป ์ ๋ฐ์ดํธ๋ ์ ์์ต๋๋ค. ์ฌ๊ฒ์ฆ API ๋ผ์ฐํธ๋ฅผ ์ฒ ์ ํ ํ ์คํธํ์ธ์.
- ๋ฐ์ดํฐ ํ์นญ ์ค๋ฅ: ์ฌ๊ฒ์ฆ ์ค์ `getStaticProps`๊ฐ ๋ฐ์ดํฐ ํ์นญ์ ์คํจํ๋ฉด ์ด์ ๋ฐ์ดํฐ๊ฐ ๊ณ์ ์ ๊ณต๋ฉ๋๋ค. ๋ฐ์ดํฐ ํ์นญ ํจ์ ๋ด์ ๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋ก๊น ์ ๊ตฌํํ์ธ์.
- `getStaticPaths`๋ฅผ ์๋ ๊ฒฝ์ฐ:** ISR๊ณผ ํจ๊ป ๋์ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ์ด๋ค ๊ฒฝ๋ก๋ฅผ ๋ฏธ๋ฆฌ ๋ ๋๋งํ๊ณ ์ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง Next.js์ ์๋ ค์ฃผ๊ธฐ ์ํด `getStaticPaths`๋ฅผ *๋ฐ๋์* ๋ด๋ณด๋ด์ผ ํฉ๋๋ค.
๊ฒฐ๋ก : ๋์ ์ ์ ์ฝํ ์ธ ์ ๋ฏธ๋
Next.js ์ฆ๋ถ ์ ์ ์ฌ์์ฑ์ ํ๋์ ์ด๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์์ด ์ค์ํ ๋ฐ์ ์ ๋ํ๋ ๋๋ค. ์ด๋ ๊ฐ๋ฐ์๊ฐ ์ ์ ์ฌ์ดํธ์ ์๋์ ํ์ฅ์ฑ์ ๊ฐ์ถ ๋์ ์ด๊ณ ์ต์ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ ์ ์๊ฒ ํด์ฃผ์ด, ๋ค์ํ ์๊ตฌ์ ๊ธฐ๋๋ฅผ ๊ฐ์ง ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ด์์ ์ธ ์๋ฃจ์ ์ด ๋ฉ๋๋ค.
ISR์ ์๋ ๋ฐฉ์๊ณผ ์ด์ ์ ์ดํดํจ์ผ๋ก์จ, ๋น ๋ฅผ ๋ฟ๋ง ์๋๋ผ ๋ณํํ๋ ์ ๋ณด์ ์ง๋ฅ์ ์ผ๋ก ๋ฐ์ํ๋ ์น์ฌ์ดํธ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ ์์๊ฑฐ๋ ํ๋ซํผ, ๋ด์ค ํฌํธ ๋๋ ์์ฃผ ์ ๋ฐ์ดํธ๋๋ ์ฝํ ์ธ ๊ฐ ์๋ ๋ชจ๋ ์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ๋ , ISR์ ์์ฉํ๋ฉด ์๋๋ฅผ ์์๋๊ฐ๊ณ , ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ๋ง์กฑ์ํค๋ฉฐ, ๊ฐ๋ฐ ๋ฐ ํธ์คํ ๋ฆฌ์์ค๋ฅผ ์ต์ ํํ ์ ์์ต๋๋ค.
์น์ด ๊ณ์ํด์ ๋ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ๊ณผ ๋ ๋์ ์ธ ์ฝํ ์ธ ๋ฅผ ์๊ตฌํจ์ ๋ฐ๋ผ, ์ฆ๋ถ ์ ์ ์ฌ์์ฑ์ ์ฐจ์ธ๋ ์น์ฌ์ดํธ๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ํต์ฌ ์ ๋ต์ผ๋ก ๋๋๋ฌ์ง๋๋ค. ๊ทธ ๊ธฐ๋ฅ์ ํ์ํ๊ณ , ๋ค์ํ ์ฌ๊ฒ์ฆ ์๊ฐ์ ์คํํ๋ฉฐ, ๊ธ๋ก๋ฒ ํ๋ก์ ํธ๋ฅผ ์ํ ๋์ ์ ์ ์ฌ์ดํธ์ ์ง์ ํ ์ ์ฌ๋ ฅ์ ๋ฐํํด ๋ณด์ธ์.